//n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 
//
// 你需要按照以下要求，给这些孩子分发糖果： 
//
// 
// 每个孩子至少分配到 1 个糖果。 
// 相邻两个孩子评分更高的孩子会获得更多的糖果。 
// 
//
// 请你给每个孩子分发糖果，计算并返回需要准备的 最少糖果数目 。 
//
// 
//
// 示例 1： 
//
// 
//输入：ratings = [1,0,2]
//输出：5
//解释：你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。
// 
//
// 示例 2： 
//
// 
//输入：ratings = [1,2,2]
//输出：4
//解释：你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。
//     第三个孩子只得到 1 颗糖果，这满足题面中的两个条件。 
//
// 
//
// 提示： 
//
// 
// n == ratings.length 
// 1 <= n <= 2 * 104 
// 0 <= ratings[i] <= 2 * 104 
// 
// Related Topics 贪心 数组 
// 👍 732 👎 0

package com.cute.leetcode.editor.cn;

import java.util.Arrays;

public class Candy {
    public static void main(String[] args) {
        new Candy().new Solution();
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 画图想出来的，步骤如下：
         * 1.创建一个数组，保存每一个评分下分到的糖果数目，先都填充为1
         * 2.正向遍历评分，只记录向右升的情况，增的话本处糖果数为上一处+1
         * 3.反向遍历评分，只对向左升的情况进行修改，将当前结果修改为较大值
         */
        public int candy(int[] ratings) {
            int len = ratings.length;
            if (len == 1) return 1;
            int res = 0;
            int[] candies = new int[len];
            Arrays.fill(candies, 1);
            for (int i = 1; i < len; i++) //向右遍历
                if (ratings[i]>ratings[i-1]) candies[i] = candies[i-1]+1;

            for (int i = len-2; i >= 0 ; i--) //向左遍历
                if (ratings[i] > ratings[i+1]) candies[i] = Math.max(candies[i],candies[i+1]+1);

            for (int c : candies) res += c;//累加
            return res;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}